package com.cskaoyan.javase.oop1._12static._1basic;

/**
 * 使用debug模式查看类加载过程中静态成员变量的赋值过程
 * 在类加载过程中,JVM会把在类加载过程中需要执行的代码,封装成一个方法
 * 在Debug模式下,就是这个类的"clinit"方法
 * 某个类的"clinit"方法被调用,方法进栈,就意味着该类正在进行类加载的过程
 * 某个类的"clinit"方法被调用结束,方法出栈,就意味着该类类加载结束
 *
 * 静态成员变量的显式赋值和成员变量一样,也是按照代码书写顺序"从上往下"执行的
 * 类加载的过程是有可能连环触发的
 * 表现在方法调用上,就是clinit方法的栈帧进栈
 * 先开始类加载的类,后完成类加载
 * 后开始类加载的类,先完成类加载
 * 这依赖于栈的"先进后出"
 *
 * @since 10:39
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        A a = new A();
    }
}

class A {
    static int numA = 10;
    static B b = new B();

    public A() {
        System.out.println("A");
    }
}

class B {
    static int numB = 20;
    static C c = new C();

    public B() {
        System.out.println("B");
    }
}

class C {
    public C() {
        System.out.println("C");
    }
}